package com.DHH.wx.action;

import com.DHH.Config.ApiConstant;
import com.DHH.wx.util.*;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class Pay_Refund {



	public void post(String out_trade_no,String total_fee ,String refund_fee){


		String appid= ApiConstant.APIID;//小程序ID
		String mch_id=ApiConstant.WX_M_id;//商户号
		String op_user_id=mch_id;//操作员帐号, 默认为商户号
		String nonce_str= UUIDHexGenerator.generate();//随机字符串

		//String transaction_id="4005722001201707099744794007";//微信订单号,微信生成的订单号，在支付通知中有返回

		String out_refund_no=nonce_str;//商户退款单号,商户系统内部的退款单号，商户系统内部唯一，同一退款单号多次请求只退一笔

//		String total_fee="10";//订单总金额，单位为分，只能为整数(int)
//		String refund_fee="10";//退款总金额，订单总金额，单位为分，只能为整数(int)





        Map<String, String> sParaTemp = new HashMap<String, String>();
        sParaTemp.put("appid", appid);
        sParaTemp.put("mch_id", mch_id);
        sParaTemp.put("nonce_str", nonce_str);
        //sParaTemp.put("transaction_id", out_trade_no);
        sParaTemp.put("out_trade_no", out_trade_no);
        sParaTemp.put("out_refund_no", out_refund_no);
        sParaTemp.put("total_fee", total_fee);
        sParaTemp.put("refund_fee", refund_fee);
        sParaTemp.put("op_user_id", op_user_id);
		 // 除去数组中的空值和签名参数
	    Map<String, String> sPara = PayUtil.paraFilter(sParaTemp);
        String prestr = PayUtil.createLinkString(sPara); // 把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
        String key = ApiConstant.WX_PAY_KEY; // 商户支付密钥

        //MD5运算生成签名
        String sign = PayUtil.sign(prestr, key, "utf-8").toUpperCase();

        PaycancelPo paycancelPo=new PaycancelPo();
        paycancelPo.setAppid(appid);
        paycancelPo.setMch_id(mch_id);
        paycancelPo.setNonce_str(nonce_str);
        //paycancelPo.setTransaction_id(transaction_id);
        paycancelPo.setOut_trade_no(out_trade_no);
        paycancelPo.setOut_refund_no(out_refund_no);
        paycancelPo.setTotal_fee(total_fee);
        paycancelPo.setRefund_fee(refund_fee);
        paycancelPo.setOp_user_id(op_user_id);
        paycancelPo.setSign(sign);

        //打包要发送的xml
        String respXml = MessageUtil.MessageToXML(paycancelPo);
        // 打印respXml发现，得到的xml中有“__”不对，应该替换成“_”
        respXml = respXml.replace("__", "_");
        String url = "https://api.mch.weixin.qq.com/secapi/pay/refund";//退款接口地址
        String param = respXml;

        ClientCustomSSL CCSSL=new ClientCustomSSL();
        try {
			String result=CCSSL.payHttps(url, param);
			System.out.println("结果:"+result);
			// 将解析结果存储在HashMap中
	        Map<String, String> map = new HashMap<String, String>();
	        InputStream in=new ByteArrayInputStream(result.getBytes("utf-8"));
	        // 读取输入流
	        SAXReader reader = new SAXReader();
	        org.dom4j.Document document;
	        document = reader.read(in);
			// 得到xml根元素
	        Element root = document.getRootElement();
	        // 得到根元素的所有子节点
	        @SuppressWarnings("unchecked")
	        List<Element> elementList = root.elements();
	        for (Element element : elementList) {
	            map.put(element.getName(), element.getText());
	        }
	        // 返回信息
	        String return_code = map.get("return_code");//返回状态码
	        String return_msg = map.get("return_msg");//返回信息
	        System.out.println("返回信息："+return_msg+",返回状态码:"+return_code);

		} catch (Exception e1) {
			e1.printStackTrace();
		}


	}


    public Map postMap(String out_trade_no,String total_fee ,String refund_fee){


        String appid= ApiConstant.APIID;//小程序ID
        String mch_id=ApiConstant.WX_M_id;//商户号
        String op_user_id=mch_id;//操作员帐号, 默认为商户号
        String nonce_str= UUIDHexGenerator.generate();//随机字符串

        //String transaction_id="4005722001201707099744794007";//微信订单号,微信生成的订单号，在支付通知中有返回

        String out_refund_no=nonce_str;//商户退款单号,商户系统内部的退款单号，商户系统内部唯一，同一退款单号多次请求只退一笔

//		String total_fee="10";//订单总金额，单位为分，只能为整数(int)
//		String refund_fee="10";//退款总金额，订单总金额，单位为分，只能为整数(int)





        Map<String, String> sParaTemp = new HashMap<String, String>();
        sParaTemp.put("appid", appid);
        sParaTemp.put("mch_id", mch_id);
        sParaTemp.put("nonce_str", nonce_str);
        //sParaTemp.put("transaction_id", out_trade_no);
        sParaTemp.put("out_trade_no", out_trade_no);
        sParaTemp.put("out_refund_no", out_refund_no);
        sParaTemp.put("total_fee", total_fee);
        sParaTemp.put("refund_fee", refund_fee);
        sParaTemp.put("op_user_id", op_user_id);
        // 除去数组中的空值和签名参数
        Map<String, String> sPara = PayUtil.paraFilter(sParaTemp);
        String prestr = PayUtil.createLinkString(sPara); // 把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
        String key = ApiConstant.WX_PAY_KEY; // 商户支付密钥

        //MD5运算生成签名
        String sign = PayUtil.sign(prestr, key, "utf-8").toUpperCase();

        PaycancelPo paycancelPo=new PaycancelPo();
        paycancelPo.setAppid(appid);
        paycancelPo.setMch_id(mch_id);
        paycancelPo.setNonce_str(nonce_str);
        //paycancelPo.setTransaction_id(transaction_id);
        paycancelPo.setOut_trade_no(out_trade_no);
        paycancelPo.setOut_refund_no(out_refund_no);
        paycancelPo.setTotal_fee(total_fee);
        paycancelPo.setRefund_fee(refund_fee);
        paycancelPo.setOp_user_id(op_user_id);
        paycancelPo.setSign(sign);

        //打包要发送的xml
        String respXml = MessageUtil.MessageToXML(paycancelPo);
        // 打印respXml发现，得到的xml中有“__”不对，应该替换成“_”
        respXml = respXml.replace("__", "_");
        String url = "https://api.mch.weixin.qq.com/secapi/pay/refund";//退款接口地址
        String param = respXml;

        ClientCustomSSL CCSSL=new ClientCustomSSL();
        try {
            String result=CCSSL.payHttps(url, param);
            System.out.println("结果:"+result);
            // 将解析结果存储在HashMap中
            Map<String, String> map = new HashMap<String, String>();
            InputStream in=new ByteArrayInputStream(result.getBytes("utf-8"));
            // 读取输入流
            SAXReader reader = new SAXReader();
            org.dom4j.Document document;
            document = reader.read(in);
            // 得到xml根元素
            Element root = document.getRootElement();
            // 得到根元素的所有子节点
            @SuppressWarnings("unchecked")
            List<Element> elementList = root.elements();
            for (Element element : elementList) {
                map.put(element.getName(), element.getText());
            }
            // 返回信息
            String return_code = map.get("return_code");//返回状态码
            String return_msg = map.get("return_msg");//返回信息
            System.out.println("返回信息："+return_msg+",返回状态码:"+return_code);

            return map;

        } catch (Exception e1) {
            e1.printStackTrace();
            return  null;
        }


    }

}
